<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="ly4sC" id="ly4sC"><span data-lake-id="udeecab91" id="udeecab91">典型回答</span></h1>
  <p data-lake-id="u3f081327" id="u3f081327"><br></p>
  <p data-lake-id="uc69a5928" id="uc69a5928"><strong><span data-lake-id="uaf8d78ad" id="uaf8d78ad">Redis 的 Pipeline 机制是一种用于优化网络延迟的技术</span></strong><span data-lake-id="ubed9081c" id="ubed9081c">，主要用于在单个请求/响应周期内执行多个命令。在没有 Pipeline 的情况下，每执行一个 Redis 命令，客户端都需要等待服务器响应之后才能发送下一个命令。这种往返通信尤其在网络延迟较高的环境中会显著影响性能。</span></p>
  <p data-lake-id="ua6ee6e8d" id="ua6ee6e8d"><span data-lake-id="uc9fec182" id="uc9fec182">​</span><br></p>
  <p data-lake-id="u8043e499" id="u8043e499"><span data-lake-id="u84c349c8" id="u84c349c8">在 Pipeline 模式下，客户端可以一次性发送多个命令到 Redis 服务器，而无需等待每个命令的响应。Redis 服务器接收到这批命令后，会依次执行它们并返回响应。</span></p>
  <p data-lake-id="u54ab000a" id="u54ab000a"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1700987066911-c1bb3104-3b52-40aa-a52d-907056a830d1.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_32%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="ud61b9a26" id="ud61b9a26"><span data-lake-id="u67728b30" id="u67728b30">​</span><br></p>
  <p data-lake-id="u680f473f" id="u680f473f"><span data-lake-id="u34b16872" id="u34b16872">所以，Pipeline通过减少客户端与服务器之间的往返通信次数，可以显著提高性能，特别是在执行大量命令的场景中。</span></p>
  <p data-lake-id="u84355fc7" id="u84355fc7"><span data-lake-id="u76ee43dc" id="u76ee43dc">​</span><br></p>
  <p data-lake-id="u8b64915c" id="u8b64915c"><span data-lake-id="u4d3ad3e6" id="u4d3ad3e6">但是，需要注意的是，</span><strong><span data-lake-id="ua90bc689" id="ua90bc689">Pipeline是不保证原子性的</span></strong><span data-lake-id="u00afc4f9" id="u00afc4f9">，他的多个命令都是独立执行的，Redis并不保证这些命令可以以不可分割的原子操作进行执行。这是Pipeline和Redis的事务的最大的区别。</span></p>
  <p data-lake-id="u87e30d70" id="u87e30d70"><span data-lake-id="u631eec47" id="u631eec47">​</span><br></p>
  <p data-lake-id="u8d27bc5e" id="u8d27bc5e"><span data-lake-id="ueca204c0" id="ueca204c0">虽然都是执行一些相关命令，但是Redis的事务提供了原子性保障，保证命令执行以不可分割、不可中断的原子性操作进行，而Pipeline则没有原子性保证。</span></p>
  <p data-lake-id="u0bdf3c2c" id="u0bdf3c2c"><span data-lake-id="ud47cf068" id="ud47cf068">​</span><br></p>
  <p data-lake-id="u135a7f75" id="u135a7f75"><span data-lake-id="ub2503039" id="ub2503039">但是他们在命令执行上有一个相同点，那就是如果执行多个命令过程中，有一个命令失败了，其他命令还是会被执行，而不会回滚的。</span></p>
  <p data-lake-id="ua09797cb" id="ua09797cb"><br></p>
  <h1 data-lake-id="CB7R9" id="CB7R9"><span data-lake-id="ub6a4db20" id="ub6a4db20">扩展知识</span></h1>
  <p data-lake-id="u07659f79" id="u07659f79"><br></p>
  <h2 data-lake-id="qPxvk" id="qPxvk"><span data-lake-id="u98f5fbee" id="u98f5fbee">如何使用Pipeline</span></h2>
  <p data-lake-id="u712a9eb0" id="u712a9eb0"><br></p>
  <p data-lake-id="udb6e3926" id="udb6e3926"><span data-lake-id="u62225b1e" id="u62225b1e">在 Java 中，可以用Jedis来使用pipeline：</span></p>
  <p data-lake-id="u8ee896d2" id="u8ee896d2"><span data-lake-id="uc0867d7a" id="uc0867d7a">​</span><br></p>
  <pre lang="java"><code>
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;

public class RedisPipelineExample {
    public static void main(String[] args) {
        // 连接到 Redis 服务器
        try (Jedis jedis = new Jedis("localhost", 6379)) {
            // 创建 Pipeline
            Pipeline pipeline = jedis.pipelined();

            // 向 Pipeline 添加命令
            pipeline.set("foo", "bar");
            pipeline.get("foo");
            pipeline.incr("counter");

            // 执行 Pipeline 中的所有命令，并获取响应
            List&lt;Object&gt; responses = pipeline.syncAndReturnAll();

            // 输出响应
            for (Object response : responses) {
                System.out.println(response);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

</code></pre>
 </body>
</html>